﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using digitwhu.Models.IRepositorys;
using digitwhu.Models;
using digitwhu.Models.Repositorys;


namespace digitwhu.Logic.BusinessLogic
{
    public class BlogLogic
    {
        #region 微博
        public static IList<int> GetOriginBlog(string type, int placeId)//获取某个地点原创微博
        {
            //type指明查询看看微博的地点。取值只可能是：building,street
            //placeId指明地点编号，可能是building上面的编号，也可能是street上面的编号
            //返回某个地点的所有原创微博编号列表
            var dbContext = new DigitwhuDataContext();
            IBlogRepository iblog = new BlogRepository(dbContext);
            return iblog.GetOriginBlog(type, placeId);
        }
        public static IList<int> GetTranBlog(string type, int placeId)//获取某个地点转发微博
        {
            //type指明查询看看微博的地点。取值只可能是：building,street
            //placeId指明地点编号，可能是building上面的编号，也可能是street上面的编号
            //返回某个地点的所有转发微博编号列表
            var dbContext = new DigitwhuDataContext();
            IBlogRepository iblog = new BlogRepository(dbContext);
            return iblog.GetTranBlog(type, placeId);
        }
        public static int GetBlogOwner(string type, int blogId)//查找微博主人
        {
            //type取值：transmit,original
            //查找给定微博ID的主人
            var dbContext = new DigitwhuDataContext();
            IBlogRepository iblog = new BlogRepository(dbContext);
            return iblog.GetBlogOwner(type, blogId);
        }
        public static int AddTranBlog(int placeId, string type, int originBlogId, int userId, string tranReason, int replyType)//转发微博
        {
            //转发微博需要对tranReason进行分析，是否含有@消息，注意，肯定要给该微博的主人发出一条@消息
            //placeId：转发微博地点编号
            //placeType：转发微博地点类型。取值：building、street
            //originBlogId：待转发的原始微博编号
            //userId：要进行转发微博操作的用户编号
            //tranReason：用户转发该条微博的理由
            //replyType：转发微博的回复类型.取值：1（不可回复），2（仅好友可回复），3（任何人都不可回复）
            //返回值：正数是转发微博成功后转发微博的ID,-1表示发微博出现异常，-2表示@消息分析失败
            var dbContext = new DigitwhuDataContext();
            IBlogRepository iblog = new BlogRepository(dbContext);
            if (iblog.AddTranBlog(placeId, type, originBlogId, userId, tranReason, replyType))
            {
                //对tranReason进行逻辑分析
                IStringAnaylize s = new StringAnalyze();
                //返回值：-1表示字符串分析异常，正数表示@消息成功的条数（只有用户名在数据库中存在的@消息才会成功）
                if (s.AddTranBlogAt(iblog.GetLatestBlogId("transmit"), tranReason) != -1)
                {
                    return iblog.GetLatestBlogId("transmit");//一切操作正常
                }
                else
                {
                    //@消息分析失败，微博转发成功
                    return -2;
                }
            }
            else
            {
                //微博转发失败
                return -1;
            }

        }
        public static bool DeleteBlog(string type, int blogId)//删除微博
        {
            //type指明要删除的微博的类型：取值只可能是:transmit,original
            //blogId指明微博的编号
            //放回删除微博是否成功
            var dbContext = new DigitwhuDataContext();
            IBlogRepository iblog = new BlogRepository(dbContext);
            return iblog.DeleteBlog(type, blogId);
        }
        public static IList<int> GetBlogComment(string type, int blogId)  //获得某条微博的评论列表
        {
            //type指明要删除的微博的类型：取值只可能是:transmit,original
            //blogId指明微博的编号
            //返回指定微博的所有评论ID列表
            var dbContext = new DigitwhuDataContext();
            IBlogRepository iblog = new BlogRepository(dbContext);
            return iblog.GetBlogComment(type, blogId);
        }
        public static int AddComment(string type, int blogId, int userId, string comment)//评论微博
        {
            //评论微博要对评论的comment进行分析，是否含有@消息
            //type指明要被评论的微博的类型：取值只可能是:transmit,original
            //blogId指明微博的编号
            //userId指明要评论该微博的用户编号
            //comment指明用户的评论内容
            //返回值：正数是评论的ID,-1表示发表评论出现异常，-2表示@消息分析失败，-3参数type错误
            var dbContext = new DigitwhuDataContext();
            IBlogRepository iblog = new BlogRepository(dbContext);
            if (iblog.AddComment(type, blogId, userId, comment))
            {
                //返回值说明：正数是评论的ID,-1表示发表评论出现异常，-2表示@消息分析失败，-3参数type错误
                //对tranReason进行逻辑分析@消息分析
                IStringAnaylize s = new StringAnalyze();
                //返回值：-1表示字符串分析异常，正数表示@消息成功的条数（只有用户名在数据库中存在的@消息才会成功）
                if (type.Equals("transmit"))
                {
                    //评论转发微博
                    if (s.AddCommentTranBlogAt(iblog.GetLatestCommentId("transmit"), comment) != -1)
                    {
                        //@消息分析成功
                        return iblog.GetLatestCommentId("transmit");
                    }
                    return -2;//@消息分析失败
                }
                else if (type.Equals("original"))
                {
                    //评论原始微博
                    if (s.AddCommentMicroBlogAt(iblog.GetLatestCommentId("original"), comment) != -1)
                    {
                        //@消息分析成功
                        return iblog.GetLatestCommentId("original");
                    }
                    return -2;//@消息分析失败
                }
                return -3;   //type参数值非法
            }
            else
            {
                //创建微博评论失败
                return -1;
            }
        }
        public static bool DeleteComment(string type, int commentId)//删除评论
        {
            //type:transmit,original
            //删除某条评论，必须判断用户是否有权限删除该评论 ，接口尚未设计？？？
            var dbContext = new DigitwhuDataContext();
            IBlogRepository iblog = new BlogRepository(dbContext);
            return iblog.DeleteComment(type, commentId);
        }
        public static int AddOriginalBlog(int placeId, string type, int userId, string content, int replyType)//发原始微博
        {
            //发微博需要对tranReason进行分析，是否含有@消息，注意，肯定要给该微博的主人发出一条@消息
            //placeId：转发微博地点编号
            //type：转发微博地点类型。取值：building、street
            //userId：要进行转发微博操作的用户编号
            //content：微博内容
            //replyType：转发微博的回复类型.取值：1（不可回复），2（仅好友可回复），3（任何人都不可回复）
            //返回值：正数是微博的ID,-1表示发微博出现异常，-2表示@消息分析失败
            var dbContext = new DigitwhuDataContext();
            IBlogRepository iblog = new BlogRepository(dbContext);
            if (iblog.AddOriginBlog(placeId, type, userId, content, replyType))
            {
                //对tranReason进行逻辑分析
                IStringAnaylize s = new StringAnalyze();
                if (s.AddMicroBlogAt(iblog.GetLatestBlogId("original"), content) != -1)
                {
                    return iblog.GetLatestBlogId("original");//一切操作正常
                }
                else
                {
                    //@消息分析失败，微博发送成功
                    return -2;
                }
            }
            else
            {
                return -1;//创建微博失败
            }
        }
        public static bool GetBlogIsUserAttention(string type, int blogId, int userId)//查询某条微博是不是用户的好友微博
        {
            //type指明要查询微博的类型：取值只可能是:transmit,original
            //blogId指明微博的编号
            //userId指明要查询的用户编号
            //返回值：true：是好友微博，false：不是好友微博
            var dbContext = new DigitwhuDataContext();
            IBlogRepository iblog = new BlogRepository(dbContext);
            return iblog.GetBlogIsUserAttention(type, blogId, userId);
        }
        public static bool GetBlogIsInUserBlack(string type, int blogId, int userId)//查询某条微博是不是被用户userId拉黑了的人的微博
        {
            //type指明要查询微博的类型：取值只可能是:transmit,original
            //blogId指明微博的编号
            //userId指明要查询的用户编号
            //返回值：true：是被拉黑的人的微博，false：不是被拉黑的人的微博
            var dbContext = new DigitwhuDataContext();
            IBlogRepository iblog = new BlogRepository(dbContext);
            return iblog.GetBlogIsInUserBlack(type, blogId, userId);
        }
        #endregion
        #region 丁玉清
        #region 关注
        public static bool AddAttention(int from, int to)//增加关注
        {
            //from:请求关注的用户编号
            //to:被关注的用户编号
            //返回值：true：增加关注成功，false：增加关注失败(已经关注了)
            DigitwhuDataContext dc = new DigitwhuDataContext();
            IManageFriendsRepository im = new ManageFriendsRepository(dc);
            if (!im.GetUserIsUserAttention(from, to))//判断是不是已经是关注了
            {
                //如果用户from没有关注用户to
                Attention a = new Attention() { userPayAttention = from, userBeFocused = to, focuseDateTime = DateTime.Now };
                Repository<Attention> ra = new Repository<Attention>(dc);
                ra.Add(a);
                ra.Save();
                return true;
            }
            return false;
        }
        public static bool DeleteAttention(int from, int to)//删除关注
        {
            //from:请求删除对用户to关注的用户编号
            //to:待被删除关注的用户编号
            //返回值：true:删除成功，false：删除失败(不存在from关注to的记录)
            Func<Attention, bool> expr = c => c.userPayAttention == from && c.userBeFocused == to;
            DigitwhuDataContext dc = new DigitwhuDataContext();
            Repository<Attention> ra = new Repository<Attention>(dc);
            Attention a = ra.FindAll(expr).First();
            if (a == null)
            {
                return false;
            }
            ra.Delete(a);
            ra.Save();
            return true;
        }
        public static List<int> GetAttentionList(int userId)//获取用户关注的用户ID列表
        {
            //userId:要获取好友ID的用户编号
            //返回值：用户userId关注的ID列表
            List<int> user = new List<int>();
            DigitwhuDataContext dc = new DigitwhuDataContext();
            var temp = from t in dc.Attention
                       where t.userPayAttention == userId
                       select t.userBeFocused;
            foreach (int i in temp)
            {
                user.Add(i);
            }
            return user;
        }
        public static List<int> GetFansList(int userId) //获取用户的粉丝列表
        {
            //userId:要获取粉丝的用户编号
            //返回值：用户userId的粉丝ID列表
            List<int> user = new List<int>();
            DigitwhuDataContext dc = new DigitwhuDataContext();
            var temp = from t in dc.Attention
                       where t.userBeFocused == userId
                       select t.userBeFocused;
            foreach (int i in temp)
            {
                user.Add(i);
            }
            return user;
        }
        #endregion
        #region 拉黑
        public static bool AddBlack(int fromUser, int toUser)//拉黑
        {
            //fromUser:准备拉黑某用户的用户
            //toUser:可能被拉黑的用户
            //返回值：true：拉黑成功，false：已经在黑名单中，再次拉黑失败
            //判断是不是已经在黑名单中
            DigitwhuDataContext dc = new DigitwhuDataContext();
            var temp = from d in dc.BlackList
                       where d.userMakeBlack == fromUser && d.userBeBlack == toUser
                       select d.userMakeBlack;
            bool isInBlack = false;
            foreach (int t in temp)
            {
                if (t == fromUser)
                {
                    isInBlack = true;         //已经在黑名单中
                }
            }
            if (isInBlack == true)
            {
                //已经在黑名单中
                return false;
            }
            BlackList b = new BlackList() { userMakeBlack = fromUser, userBeBlack = toUser };
            Repository<BlackList> rb = new Repository<BlackList>(dc);
            rb.Add(b);
            rb.Save();
            //从fromUser的关注列表中删除用户toUser
            Attention att = dc.Attention.Single<Attention>(a => a.userPayAttention == fromUser && a.userBeFocused == toUser);
            if (att != null)
            {
                dc.GetTable<Attention>().DeleteOnSubmit(att);
                dc.SubmitChanges();
            }
            return true;


        }
        public static bool DeleteBlack(int from, int to)//取消拉黑
        {
            //fromUser:准备取消拉黑某用户的用户
            //toUser:可能被取消拉黑的用户
            //返回值：true：取消拉黑成功，false：黑名单中没记录
            Func<BlackList, bool> expr = b => b.userMakeBlack == from && b.userBeBlack == to;
            DigitwhuDataContext dc = new DigitwhuDataContext();
            Repository<BlackList> rb = new Repository<BlackList>(dc);
            BlackList bl;
            try
            {
                if ((bl = rb.FindAll(expr).First()) != null)//如果在黑名单中则取消拉黑
                {
                    rb.Delete(bl);
                    rb.Save();
                    return true;
                }
                return false;
            }
            catch (Exception e)
            {
                return false;   //说明在函数FindAll抛出了异常，空集合
            }
        }
        #endregion

        public static List<int> GetAllAtOriginalBlog(int userId)//获得在原创微博中或者原创微博评论中@用户的原创微博
        {
            //userId:用户编号
            //返回值：原创微博编号列表
            //List<LCommentList> lcll = new List<LCommentList>();
            List<int> result = new List<int>();
            DigitwhuDataContext dc = new DigitwhuDataContext();
            IMessageRepository mr = new MessageRepository(dc);
            List<OriginalMicroBlog> list_o = mr.GetAllAtOriginBlog(userId).ToList();
            foreach (var i in list_o)
            {
                result.Add(i.originalBlogId);
            }
            return result;
            //List<TranMicroBlog> list_t = mr.GetAllAtTranMicroBlog(userId).ToList();
            // return GetOriginalAndTranBlog(userId, list_o, list_t);
        }
        public static List<int> GetAllAtTranBlog(int userId)//获得转发微博中或者转发微博评论中@用户的转发微博
        {
            //userId:用户编号
            //返回值：转发微博编号列表
            //List<LCommentList> lcll = new List<LCommentList>();
            List<int> result = new List<int>();
            DigitwhuDataContext dc = new DigitwhuDataContext();
            IMessageRepository mr = new MessageRepository(dc);
            List<TranMicroBlog> list_t = mr.GetAllAtTranMicroBlog(userId).ToList();
            //  List<OriginalMicroBlog> list_o = mr.GetAllAtOriginBlog(userId).ToList();
            foreach (var i in list_t)
            {
                result.Add(i.tranMicroBlogId);
            }
            return result;
            // return GetOriginalAndTranBlog(userId, list_o, list_t);
        }
        public static List<int> GetAllCommentOriginalBlog(int userId)//获得用户的被评论的原创微博
        {
            //userId:用户编号
            //返回值：原创微博编号列表
            List<int> result = new List<int>();
            DigitwhuDataContext dc = new DigitwhuDataContext();
            MessageRepository mr = new MessageRepository(dc);
            List<OriginalMicroBlog> list_o = mr.GetAllOriginBlogBeCommented(userId).ToList();
            foreach (var temp in list_o)
            {
                result.Add(temp.originalBlogId);
            }
            return result;
            // List<TranMicroBlog> list_t = mr.GetAllTranBlogBeCommented(userId).ToList();
            // return GetOriginalAndTranBlog(userId, list_o, list_t);
        }
        public static List<int> GetAllCommentTranBlog(int userId)//获得用户的被评论的转发微博
        {
            //userId:用户编号
            //返回值：转发微博编号列表
            List<int> result = new List<int>();
            DigitwhuDataContext dc = new DigitwhuDataContext();
            MessageRepository mr = new MessageRepository(dc);
            List<TranMicroBlog> list_t = mr.GetAllTranBlogBeCommented(userId).ToList();
            foreach (var temp in list_t)
            {
                result.Add(temp.tranMicroBlogId);
            }
            return result;
            // List<TranMicroBlog> list_t = mr.GetAllTranBlogBeCommented(userId).ToList();
            // return GetOriginalAndTranBlog(userId, list_o, list_t);
        }
        #region 私信
        public static List<int> GetAllPrivateMsgList(int userId)//获得私信列表
        {
            //userId:用户编号
            //返回值：私信编号列表
            List<int> result = new List<int>();
            //List<LPrivateMsg> lpml = new List<LPrivateMsg>();
            List<PrivateMsg> pm = GetAllPrivateMsg(userId);//获得私信对象列表
            foreach (PrivateMsg m in pm)
            {
                result.Add(m.privateMsgId);
            }
            // return JsonHelper.JsonSerializer<List<LPrivateMsg>>(lpml);
            return result;
        }
        public static void AddPrivateMsg(int msgFrom, int msgTo, string msgContent)//发送私信
        {
            PrivateMsg p = new PrivateMsg()
            {
                msgFrom = msgFrom,
                msgTo = msgTo,
                msgContent = msgContent,
                msgDateTime = DateTime.Now,
            };
            DigitwhuDataContext dc = new DigitwhuDataContext();
            Repository<PrivateMsg> rb = new Repository<PrivateMsg>(dc);
            rb.Add(p);
            rb.Save();
        }
        #endregion

        #region 私有函数
        private static List<PrivateMsg> GetAllPrivateMsg(int userId)//根据用户id获得所有的私信列表
        {
            DigitwhuDataContext dc = new DigitwhuDataContext();
            Repository<PrivateMsg> rb = new Repository<PrivateMsg>(dc);
            Func<PrivateMsg, bool> expr = m => m.msgTo == userId;
            List<PrivateMsg> list = rb.FindAll(expr).OrderByDescending(u => u.msgDateTime).ToList();
            return list;
        }
        #endregion
        #endregion
    }
}